export default{
   // 为当前模块开启命名空间
   namespaced:true,
   
   // 模块的 state 数据
   state:()=>({
      // 购物车的数组，用来存储购物车中每个商品的信息对象
         // 每个商品的信息对象，都包含如下 6 个属性：
         //      商品id，    商品名称，   商品价格，    商品数量，        商品图片，  商品勾选状态
         // { goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
         // cart:[]
         // 项目刚初始化的时候要给它进行赋值(将本地存储的字符串转化回数组)
         cart: JSON.parse(uni.getStorageSync('cart') || '[]')
   }),
    // 模块的 mutations 方法
    mutations:{
      // 点击加入购物车方法
      addToCart(state,goods){
        // 根据提交的商品的Id，查询购物车中是否存在这件商品
        // 如果不存在，则 findResult 为 undefined；否则，为查找到的商品信息对象
        const findResult=state.cart.find((x)=>x.goods_id===goods.goods_id)
        // 测试加入购物车数据前vuex内部cart对象内商品数据
        console.log('测试加入购物车数据前vuex内部cart对象内商品数据',findResult);
        
        if(!findResult){
          // undefined取反为true
          // 如果购物车中没有这件商品，则直接 push
          state.cart.push(goods)
        }else{
          // 之前存在这件商品findResult为找到那件商品信息；取反为false
          // 如果购物车中有这件商品，则只更新数量即可
          findResult.goods_count++
        }
        // 只要购物车数组中数据发生更改都要调用saveToStorage方法
        //  通过 commit 方法，调用 m_cart 命名空间下的 saveToStorage 方法（注意这里调用也要带模块名）
        this.commit('m_cart/saveToStorage')
        
        // 测试加入购物车数据后vuex内部cart对象内商品数据
        console.log('测试加入购物车数据后vuex内部cart对象内商品数据',state.cart);
      },
      // 持久化存储购物车中的商品数据的方法(修改购物车数据都要调用这个方法)
      saveToStorage(state) {
        // JSON.stringify(state.cart)先把数组转化为字符串
        uni.setStorageSync('cart',JSON.stringify(state.cart))
      },
      // 更新购物车中商品的勾选状态方法
      // event_goods这里只含``商品id``和``商品最新勾选状态``
      updateGoodsState(state,event_goods){
        // 根据 goods_id 查询购物车中对应商品的信息对象
        const findState=state.cart.find((x)=>x.goods_id===event_goods.goods_id)
        // 有对应的商品信息对象
        if(findState){
           // 更新对应商品的勾选状态
           findState.goods_state=event_goods.goods_state
           // 持久化存储到本地(vuex购物车数据发生改变调用saveToStorage方法)
           this.commit('m_cart/saveToStorage')
        }
      },
      // 更新购物车中商品的数量方法
      updateGoodsCount(state, event_goods) {
         // 根据 goods_id 查询购物车中对应商品的信息对象
         const findCount=state.cart.find((x)=>x.goods_id===event_goods.goods_id)
         
         if(findCount){
           // 更新对应商品的数量
           findCount.goods_count=event_goods.goods_count
            // 持久化存储到本地(vuex购物车数据发生改变调用saveToStorage方法)
           this.commit('m_cart/saveToStorage')
         }
      },
      // 根据 Id 从购物车中删除对应的商品信息方法
      // 这里不需要修改单项内部的数据信息；只需要传递商品id即可
      removeGoodsById(state, event_goods_id) {
        // 删除商品<=>过滤出不含该商品id的``其他商品``
        state.cart=state.cart.filter((x)=>x.goods_id!==event_goods_id)
        // 持久化存储到本地(vuex购物车数据发生改变调用saveToStorage方法)
        this.commit('m_cart/saveToStorage')
      },
      // 更新所有商品的勾选状态方法(全选/反选radio影响所有商品勾选状态)
      updateAllGoodsState(state, newState) {
         // 循环更新购物车中每件商品的勾选状态
         state.cart.forEach((x)=>x.goods_state=newState)
         // 持久化存储到本地(vuex购物车数据发生改变调用saveToStorage方法)
         this.commit('m_cart/saveToStorage')
      }

      
    },
    // 模块的 getters 属性
    getters: {
      // 动态统计购物车中商品的总数量(勾选+未勾选)
      total(state){
        let c=0
        // 循环统计``每种商品的数量``(所以要循环)，累加到变量 c 中
        // state.cart.forEach(goods=>c+=goods.goods_count)
        // console.log('删除',c);
        // return c
        // 使用数组的reduce方法代替forEach方法
        // 这个0只会在`第一次累加`的时候生效
        return state.cart.reduce((total,item)=>total+=item.goods_count,0)
      },
      // 已勾选的商品的总数量
      checkedCount(state) {
         // 1先使用 filter 方法，从购物车中过滤器已勾选的商品
         // 2再使用 reduce 方法，将已勾选的商品总数量进行累加
         // reduce() 的返回值就是已勾选的商品的总数量
         // x=>x.goods_state；<=>x=true 才会收集为true的商品项
         return state.cart.filter(x=>x.goods_state).reduce((statetotal,item)=>statetotal+=item.goods_count,0)
      },
      // 已勾选的商品的总价
      checkedGoodsAmount(state) {
        // 先使用 filter 方法，从购物车中过滤器已勾选的商品
        // 再使用 reduce 方法，将已勾选的商品数量 * 单价之后，进行累加
        // reduce() 的返回值就是已勾选的商品的总价
        // 最后调用 toFixed(2) 方法，保留两位小数
        // x=>x.goods_state；<=>x=true 才会收集为true的商品项
        return state.cart.filter((x)=>x.goods_state).reduce((totalprice,item)=>totalprice+=item.goods_count*item.goods_price,0).toFixed(2)
      }
    },

}